package br.com.petsis.funcionalidades.painelControle;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.petsis.entity.Empresa;
import br.com.petsis.entity.Pagamento;
import br.com.petsis.entity.Raca;
import br.com.petsis.utilitarios.UtilDate;
import br.com.petsis.utilitarios.UtilMail;

@Name("painelControleController")
@Scope(ScopeType.CONVERSATION)
@Restrict(value="#{credentials.username.equals('admin')}")
public class PainelControleController {
	
	private static final String ASSINATURA_PADRAO_EMAIL = "<center><table><tr><td><img src=\"cid:image\"></td><td align='left'><b>Sistema PetSis</b><br/>\nAndré Ferreira dos Santos<br/>\nResponsável Técnico<br/>\nsuporte@petsis.com.br</td></tr></table></center>";
	private static final String QRY_EMPRESAS_VALIDADE = "select e from Empresa e where e.flgAtivo = 'T' order by e.dtaValidade";
	
	@In(create=true)
	private EntityManager entityManager;
	
	private List<Empresa> listaEmpresasValidade;
	
	private List<Pagamento> listaPagamentos;
	
	private boolean selecionadoTodos;
	
	private boolean exibePopupEmail;
	
	private boolean exibePopupPagamentos;
	
	private boolean exibePopupNovoPagamento;
	
	private String assunto;
	
	private String texto;
	
	private byte[] uploadedFile;
	
	private String pictureName;
	
	private String contentType;
	
	private long size;
	
	private Empresa empresaSelecionada;
	
	private Pagamento pagamentoEdicao;
	
	public Pagamento getPagamentoEdicao() {
		if (pagamentoEdicao == null) {
			pagamentoEdicao = new Pagamento();
		}
		return pagamentoEdicao;
	}

	public void setPagamentoEdicao(Pagamento pagamentoEdicao) {
		this.pagamentoEdicao = pagamentoEdicao;
	}

	public boolean isExibePopupEmail() {
		return exibePopupEmail;
	}

	public void setExibePopupEmail(boolean exibePopupEmail) {
		this.exibePopupEmail = exibePopupEmail;
	}

	public boolean isExibePopupPagamentos() {
		return exibePopupPagamentos;
	}

	public void setExibePopupPagamentos(boolean exibePopupPagamentos) {
		this.exibePopupPagamentos = exibePopupPagamentos;
	}

	public boolean isExibePopupNovoPagamento() {
		return exibePopupNovoPagamento;
	}

	public void setExibePopupNovoPagamento(boolean exibePopupNovoPagamento) {
		this.exibePopupNovoPagamento = exibePopupNovoPagamento;
	}

	public String getAssunto() {
		return assunto;
	}

	public void setAssunto(String assunto) {
		this.assunto = assunto;
	}

	public String getTexto() {
		return texto;
	}

	public void setTexto(String texto) {
		this.texto = texto;
	}
	
	public byte[] getUploadedFile() {
		return uploadedFile;
	}

	public void setUploadedFile(byte[] uploadedFile) {
		this.uploadedFile = uploadedFile;
	}

	public String getPictureName() {
		return pictureName;
	}

	public void setPictureName(String pictureName) {
		this.pictureName = pictureName;
	}

	public String getContentType() {
		return contentType;
	}

	public void setContentType(String contentType) {
		this.contentType = contentType;
	}

	public long getSize() {
		return size;
	}

	public void setSize(long size) {
		this.size = size;
	}

	public void onLoad(){
		
	}
	
	public void onLoadList(){
	}
	
	public void criarRacasEmpresas(){
		int cont = 0;
		List<Raca> racas = null;
		for(Empresa e : getListaEmpresasValidade()){
			if(e.isSelecionado()){
				cont++;
				if(racas == null){
					racas = entityManager.createQuery("select r from Raca r where r.empresa is null and r.flgAtivo = 'T'").getResultList();
				}
				for(Raca r : racas){
					Raca novaRaca = new Raca(r);
					novaRaca.setEmpresa(e);
					entityManager.merge(novaRaca);
				}
			}
		}
		if(cont == 0){
			FacesMessages.instance().add(Severity.ERROR,"É necessário selecionar ao menos uma empresa");
		}else{
			entityManager.flush();
			FacesMessages.instance().add(Severity.INFO,"Raças criadas com sucesso.");
		}
	}
	
	public void inicializarPopupPagamentos(Empresa empresa){
		listaPagamentos = recuperaPagamentosEmpresa(empresa);
		setExibePopupPagamentos(true);
		empresaSelecionada = empresa;
	}
	
	public void inicializarPopupNovoPagamento(){
		setPagamentoEdicao(null);
		getPagamentoEdicao().setEmpresa(empresaSelecionada);
		setExibePopupNovoPagamento(true);
	}
	
	public void inicializarPopupEmail(){
		int cont = 0;
		for(Empresa e : getListaEmpresasValidade()){
			if(e.isSelecionado()){
				cont++;
			}
		}
		if(cont == 0){
			FacesMessages.instance().add(Severity.ERROR,"Selecione ao menos uma empresa para enviar o e-mail.");
		}else{
			setExibePopupEmail(true);
		}
		selecionaTemplate(5);
	}
	
	public void fechaPopupEmail(){
		setExibePopupEmail(false);
	}
	
	public void fechaPopupPagamentos(){
		setExibePopupPagamentos(false);
	}
	
	public void fechaPopupNovoPagamento(){
		setExibePopupNovoPagamento(false);
	}
	
	public void excluirPagamento(Pagamento pagamento){
		Empresa empresa = pagamento.getEmpresa(); 
		entityManager.remove(pagamento);
		entityManager.flush();
		listaPagamentos = recuperaPagamentosEmpresa(empresa);
		FacesMessages.instance().add(Severity.INFO,"Pagamento excluído com sucesso.");
	}
	
	public void editarPagamento(Pagamento pagamento){
		setPagamentoEdicao(pagamento);
		setExibePopupNovoPagamento(true);
	}
	
	public void salvarPagamento(){
		entityManager.merge(getPagamentoEdicao());
		entityManager.flush();
		listaPagamentos = recuperaPagamentosEmpresa(getPagamentoEdicao().getEmpresa());
		FacesMessages.instance().add(Severity.INFO,"Pagamento salvo com sucesso.");
		fechaPopupNovoPagamento();
	}
	
	public List<Pagamento> recuperaPagamentosEmpresa(Empresa empresa){
		return entityManager.createQuery("select p from Pagamento p where p.empresa.idEmpresa = :idEmpresa order by p.dtaVencimento DESC")
			.setParameter("idEmpresa", empresa.getIdEmpresa())
			.getResultList();
	}
	
	public void excluir(){
		List<Empresa> listaRemocao = new ArrayList<Empresa>();
		for(Empresa e : getListaEmpresasValidade()){
			if(e.isSelecionado()){
				e.setFlgAtivo('F');
				entityManager.merge(e);
				listaRemocao.add(e);
			}
		}
		entityManager.flush();
		getListaEmpresasValidade().removeAll(listaRemocao);
		setSelecionadoTodos(false);
	}
	
	public void salvarTodasEmpresas(){
		for(Empresa e : getListaEmpresasValidade()){
			entityManager.merge(e);
		}
		entityManager.flush();
		FacesMessages.instance().add(Severity.INFO,"Empresas salvas com sucesso.");
	}
	
	public String recuperaCorBackground(Empresa empresa){
		if(UtilDate.data1MenorOuIgualQueData2(empresa.getDtaValidade(),new Date())){
			return "red";
		}else if(UtilDate.data1IgualData2(UtilDate.getDataAcrescidaEmDias(new Date(), 1), empresa.getDtaValidade())){
			return "yellow";
		}else{
			return "white";
		}
	}
	
	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}
	
	public void selecionaTodosPainel(){
		for(Empresa c : getListaEmpresasValidade()){
			if(isSelecionadoTodos()){
				c.setSelecionado(true);
			}else{
				c.setSelecionado(false);
			}
		}
	}
	
	public List<Empresa> getListaEmpresasValidade() {
		if (listaEmpresasValidade == null) {
			listaEmpresasValidade = entityManager.createQuery(QRY_EMPRESAS_VALIDADE).getResultList();
		}
		return listaEmpresasValidade;
	}

	public void setListaEmpresasValidade(List<Empresa> listaEmpresasValidade) {
		this.listaEmpresasValidade = listaEmpresasValidade;
	}
	
	public List<Pagamento> getListaPagamentos() {
		if (listaPagamentos == null) {
			listaPagamentos = new ArrayList<Pagamento>();
		}
		return listaPagamentos;
	}

	public void setListaPagamentos(List<Pagamento> listaPagamentos) {
		this.listaPagamentos = listaPagamentos;
	}

	public boolean uploadAnexo(){
//		if(uploadedFile != null){
			if(size > 0 && !contentType.equals("image/png") &&
					!contentType.equals("image/gif") &&
					!contentType.equals("image/jpg") &&
					!contentType.equals("image/jpeg")){
				FacesMessages.instance().add(Severity.ERROR,"Só é permitido o anexo de imagens.");
				return false;
			}
		/*}else{
			FacesMessages.instance().add(Severity.ERROR,"Não foi possível fazer o upload do anexo.");
			return false;
		}*/
		return true;
	}

	public void selecionaTemplate(int codigo){
		switch (codigo) {
		case 1:
			setTexto(templateEmail1());
			setAssunto("PETSIS: ATENÇÃO - SEU PLANO IRÁ VENCER AMANHÃ!");
			break;
		case 2:
			setTexto(templateEmail2());
			setAssunto("PETSIS: RENOVAÇÃO DE PLANO");
			break;
		case 3:
			setTexto(templateEmail3());
			setAssunto("PETSIS: ATENÇÃO - SEU PLANO VENCEU!");
			break;
		case 4:
			setTexto(templateEmail4());
			setAssunto("PETSIS: SEJA BEM VINDO");
			break;
		case 5:
			setTexto(null);
			setAssunto(null);
			break;
		case 6:
			setTexto("<center><img src=\"cid:image\"></center>");
			setAssunto(null);
			break;
		case 7:
			setTexto(templateEmail7());
			setAssunto("PETSIS: INFORME DE MANUTENÇÃO PROGRAMADA");
			break;

		default:
			break;
		}
	}
	
	public void enviarEmail(){
		if(!uploadAnexo()){
			return;
		}
    	try {
    		for(Empresa e : getListaEmpresasValidade()){
    			if(e.isSelecionado()){
    				UtilMail.enviarEmailAssincrono(getTexto(), e.getDscEmail(), getAssunto(), uploadedFile, pictureName);
    			}
    		}
    		FacesMessages.instance().add(Severity.INFO,"E-mail(s) enviado(s) com sucesso.");
    		fechaPopupEmail();
		} catch (Exception e) {
			e.printStackTrace();
			FacesMessages.instance().add(Severity.ERROR,"Não foi possível enviar o(s) e-mail(s)");
		}
	}
	
	/**
	 * 1. Aviso de Validade
	 */
	public String templateEmail1(){
    	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    	StringBuilder texto = new StringBuilder();
    	texto.append("<center>");
    	texto.append("<font color='red' size='4'><b>Atenção!</b></font><br/><br/>\n");
    	texto.append("O seu plano está vencendo amanhã, dia ");
    	texto.append(sdf.format(UtilDate.getDataAcrescidaEmDias(new Date(), 1)));
    	texto.append(".<br/><br/>\n");
    	texto.append("Por favor, efetue o pagamento da renovação para evitar a suspensão do serviço.\n");
    	texto.append("</center><br/>");
		texto.append(ASSINATURA_PADRAO_EMAIL);
    	return texto.toString();
    }
	
	/**
	 * 2. Validade renovada
	 */
	public String templateEmail2(){
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		StringBuilder texto = new StringBuilder();
		texto.append("<center>");
		texto.append("<font color='red' size='4'><b>Atenção!</b></font><br/><br/>\n");
		texto.append("O seu plano foi renovado até a data ");
		texto.append("[DATA]");
		texto.append(".<br/><br/>\n");
		texto.append("A PetSis agradece por ser nosso cliente.\n");
		texto.append("</center><br/>");
		texto.append(ASSINATURA_PADRAO_EMAIL);
		return texto.toString();
	}
	
	/**
	 * 3. Validade expirada
	 */
	public String templateEmail3(){
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		StringBuilder texto = new StringBuilder();
		texto.append("<center>");
		texto.append("<font color='red' size='4'><b>Atenção!</b></font><br/><br/>\n");
		texto.append("A validade do seu plano expirou em ");
		texto.append("[DATA]");
		texto.append(".<br/><br/>\n");
		texto.append("Efetue o pagamento do seu plano para continuar usando o PetSis.\n");
		texto.append("</center><br/>");
		texto.append(ASSINATURA_PADRAO_EMAIL);
		return texto.toString();
	}
	
	/**
	 * 4. Boas vindas e manual
	 */
	public String templateEmail4(){
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		StringBuilder texto = new StringBuilder();
		texto.append("<center>");
		texto.append("<font size='4'><b>Bem vindo ao PetSis!</b></font><br/><br/>\n");
		texto.append("É um enorme prazer tê-lo como cliente.<br/><br/>\n");
		texto.append("O nosso suporte é 24 horas.<br/> Caso necessite, mande um e-mail para:<br/> suporte@petsis.com.br<br/><br/>\n");
		texto.append("</center><br/>");
		texto.append(ASSINATURA_PADRAO_EMAIL);
		return texto.toString();
	}
	
	/**
	 * 7. Manutenção programada
	 */
	public String templateEmail7(){
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		StringBuilder texto = new StringBuilder();
		texto.append("<center>");
		texto.append("<font color='red' size='4'><b>Atenção!</b></font><br/><br/>\n");
		texto.append("Informamos que estaremos efetuando uma manutenção programada.<br/>\n");
		texto.append("O sistema ficará indisponível durante o perído de [HORA INICIO] às [HORA FIM] horas do dia [DATA].<br/>\n");
		texto.append("Pedimos desculpas pelo incomodo.<br/>\n");
		texto.append("Estamos trabalhando para melhor atendê-los.\n");
		texto.append("<br/><br/>\n");
		texto.append("</center><br/>");
		texto.append(ASSINATURA_PADRAO_EMAIL);
		return texto.toString();
	}
	
}
